package br.com.ds3.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.ds3.model.Atividade;
import br.com.ds3.model.Evento;
import br.com.ds3.util.DS3Util;

/**
 *
 * @author marcio
 */
@Component
public class AtividadeDAO extends GenericDAO<Atividade>{
	private final Long TAMANHO_PAGINA = new Long(3);
    @Override
    public Class<Atividade> getModelClass() {
        return Atividade.class;
    }
    
    private Criteria createCriteriaPesquisa(String nome, Long idEvento) {
        Criteria criteria = getSession().createCriteria(getModelClass());
        
        if (!DS3Util.isEmtpy(nome)) {
        	criteria.add(Restrictions.like("nome", nome.toUpperCase() + "%"));
        }
        
        if (idEvento != null) {
        	criteria.add(Restrictions.eq("evento.id", idEvento));
        }
        
        return criteria;
    }
    
    public Long countPaginas(String nome, Long idEvento) {
    	Criteria criteria = createCriteriaPesquisa(nome, idEvento);
    	
    	Long quantidadeRegistros = countCriteria(criteria);
    	
    	Long paginas = countPaginas(quantidadeRegistros, TAMANHO_PAGINA);
    	
    	return paginas;
    }
    
    public List<Atividade> pesquisa(String nome, Long idEvento,  Long pagina) {
		Criteria criteria = createCriteriaPesquisa(nome, idEvento);
		criteria.addOrder(Order.asc("nome"));
		return executaCriteria(criteria, pagina, TAMANHO_PAGINA);
	}
    
    public List<Atividade> listaProximasAtividades() {
		Criteria criteria = getSession().createCriteria(Atividade.class);
		criteria.createAlias("evento", "e");
		criteria.add(Restrictions.ge("data", new Date()));
		criteria.addOrder(Order.asc("e.nome"));
		return executaCriteria(criteria, null, null);
	}
    
    public Atividade getAtividadePadraoDoEvento(Evento evento) {
		Criteria criteria = getSession().createCriteria(Atividade.class);
		criteria.createAlias("evento", "e");
		criteria.add(Restrictions.eq("e.id", evento.getId()));
		criteria.add(Restrictions.eq("nome", "PARTICIPANTE"));
		return (Atividade) criteria.uniqueResult();
    }
}
